﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WordSegmenter;
using System.IO;

namespace MyWordSegmentorJSharp
{
    public class KWCollector
    {
        protected WordSeg _Segmentor;
        protected List<string> _Stopword;

        public KWCollector(string sDictionaryFolder)
        {
            if (Directory.Exists(sDictionaryFolder) == true)
            {
                _Segmentor = new WordSeg(sDictionaryFolder);
                _Segmentor.loadDics();

                _Stopword = new List<string>();
                StreamReader sr = new StreamReader(sDictionaryFolder + "\\stopword.txt");
                while (sr.EndOfStream == false)
                {
                    _Stopword.Add(sr.ReadLine().Trim());
                }
                sr.Close();
            }
            else
            {
                _Segmentor = null;
            }
        }

        /// <summary>
        /// Rút trích đơn giản keyword của một đoạn văn bản
        /// </summary>
        /// <param name="sDocument">Đoạn văn bản cần rút keyword</param>
        /// <param name="nMinKeywordAppear">Số lần xuất hiện tối thiểu của keyword trong Document</param>
        /// <returns>Danh sách các keyword trong Document thỏa ngưỡng</returns>
        public List<string> ParseKeywords(string sDocument, int nMinKeywordAppear)
        {
            List<string> arKeyWord = new List<string>();

            if (_Segmentor == null)
                return arKeyWord;
            
            Dictionary<string, int> dicKeyword = new Dictionary<string, int>();

            // Tach giua tren dau
            string[] lines = sDocument.Split(new char[] {'.',';','!',':',',','(',')','[',']','{','}','\\', '/', '\'','<','>'}, StringSplitOptions.RemoveEmptyEntries);
            foreach (string line in lines)
            {
                string viLine = ConvertToVNSentence(line).Trim();
                string[] viWords = viLine.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                foreach (string word in viWords)
                {
                    if (dicKeyword.ContainsKey(word) == false)
                        dicKeyword.Add(word, 1);
                    else
                        dicKeyword[word] = dicKeyword[word] + 1;
                }
            }

            foreach (string keyword in dicKeyword.Keys)
            {
                // Ko xuat hien trong danh sach stopword cua tieng viet
                if (_Stopword.IndexOf(keyword) == -1)
                {
                    if (dicKeyword[keyword] >= nMinKeywordAppear)
                        arKeyWord.Add(keyword.ToLower());
                }
            }
            return arKeyWord;
        }

        public string ConvertToVNSentence(string line)
        {
            if (_Segmentor == null)
                return line;
            line = line.Trim();
            try 
            {
                return _Segmentor.segmentSentence(line);
            }
            catch
            {
                return line;
            }
        }
    }
}
